from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
from random import randrange


class HelloMiddle(MiddlewareMixin):
    def process_request(self, request):
        '''在执⾏行行路路由前被调⽤用
        :param request: 是一个HttpRequest请求对象
        :return:返回None会继续调⽤用下⼀个中间件的process_request⽅方法，
        返回HttpResponse，则执⾏行行⾃自⼰己process_response
        '''
        print('666', request.META.get('REMOTE_ADDR'))

    def process_view(self, request, callback, callback_args, callback_kwargs):
        '''调⽤用视图之前执⾏
        :param request: HttpRequest对象
        :param callback: 是一个即将调⽤用的视图函数，不是字符串串函数名
        :param callback_args: 传递给视图函数的位置参数
        :param callback_kwargs: 传递给视图函数的关键字参数
        :return: 如果返回None，会继续执⾏行行处理理此请求，然后调⽤用下一个中间件的process_view，直⾄至执⾏行行视图函数
                如果返回HttpResponse,则直接执⾏行行最后⼀个中间件的process_response
        '''
        pass

    def process_template_response(self, request, response):
        '''只要视图返回一个render⽅方法返回的对象，
        就会调⽤用process_template_response
        :param request: HttpRequest对象
        :param response: 是一个由Django view或者中间件返回的 TemplateResponse 对象
        :return: 必须返回⼀个render⽅方法执⾏行行后的response对象
        '''
        pass

    def process_exception(self, request, exception):
        '''当视图抛出异常时调⽤用
        :param request: HttpRequest 对象
        :param exception:
        :return: view函数中raise的Exception对象
        '''
        print('request is:', request)
        print('exception is:', exception)


    def process_response(self, request, response):
        '''所有响应返回浏览器器之前调⽤用
        :param request: HttpRequest对象
        :param response: HttpResponse对象
        :return: 必须是HttpResponse对象
        '''
        return response
